package modele;

import java.util.ArrayList;
import java.util.Observable;

public class Commande extends Observable {

	private String dateLivraison;
	private String heureLivraison;
	private String adresseLivraison;
	private ArrayList<RestaurantCommande> restaurants;
	private int numeroConfirmation;
	private boolean prisEnCharge = false;

	/**
	 * Constructeur
	 * @param dateLivraison - String
	 * @param heureLivraison - String
	 * @param adresseLivraison - String
	 */
	public Commande(String dateLivraison, String heureLivraison, String adresseLivraison) {
		this.dateLivraison = dateLivraison;
		this.heureLivraison = heureLivraison;
		this.adresseLivraison = adresseLivraison;
		this.restaurants = new ArrayList<RestaurantCommande>();
	}
	
	/**
	 * Notifie ses observateurs
	 */
	public void notifie() {
		setChanged();
		notifyObservers();
	}
	
	public String getAdresseLivraison() {
		return this.adresseLivraison;
	}
	public int getNumConfirmation() {
		return this.numeroConfirmation;
	}
	public ArrayList<RestaurantCommande> getListeRestaurantCommande() {
		return this.restaurants;
	}
	public ArrayList<ItemDansCommande> getListeItems() {
		ArrayList<ItemDansCommande> listeItems = new ArrayList<ItemDansCommande>();
		for (RestaurantCommande restaurantCommande : this.restaurants) {
			for (ItemDansCommande itemsDansCommande : restaurantCommande.getListeItems()) {
				listeItems.add(itemsDansCommande);
			}
		}
		return listeItems;
	}
	public void setNumConfirmation(int numConfirmation) {
		this.numeroConfirmation = numConfirmation;
	}
	public void setListeRestaurantCommande(ArrayList<RestaurantCommande> restaurantCommande) {
		this.restaurants = restaurantCommande;
	}
	
	
	/**
	 * Prend la commande en charge
	 */
	public void prendreEnCharge() {
		this.prisEnCharge = true;
	}
	
	public boolean estPrisEnCharge() {
		return this.prisEnCharge;
	}
	
	/**
	 * Retourne une description de la commande
	 * @return Le numéro de confirmation et l'adresse de livraison - String
	 */
	public String toString() {
		return this.numeroConfirmation+" - "+this.adresseLivraison;
	}
	
	public RestaurantCommande getRestaurantCommande(Restaurant restaurant) {
		RestaurantCommande leRestoCommande = null;
		if (this.restaurants.size() > 0) {
			for (RestaurantCommande restaurantCommande : this.restaurants) {
				if (restaurantCommande.getRestaurant() == restaurant) {
					leRestoCommande = restaurantCommande;
				}
			}
		}
		if (leRestoCommande == null) {
			this.restaurants.add(leRestoCommande = new RestaurantCommande(restaurant));
		}
		return leRestoCommande;
	}
	
	/**
	 * Ajoute un item dans la commande
	 * @param item - ItemMenu
	 * @param quantite - int
	 * @param restaurant - Restaurant
	 */
	public void addItemCommande(ItemMenu item, int quantite, Restaurant restaurant) {
		getRestaurantCommande(restaurant).addItem(item, quantite);
		notifie();
	}
	
	/**
	 * Retire un item de la commande
	 * @param item - ItemMenu
	 * @param quantite - int
	 * @param restaurant - Restaurant
	 */
	public void removeItemCommande(ItemMenu item, int quantite, Restaurant restaurant) {
		RestaurantCommande restaurantCommande = getRestaurantCommande(restaurant);
		restaurantCommande.removeItem(item, quantite);
		if (restaurantCommande.getListeItems().size() < 1) {
			this.restaurants.remove(restaurantCommande);
		}
		notifie();
	}
}